+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
+Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
+ the timer on destroy, or when we are notified that we are
+ shadowed by a modal dialog.
+
+ * gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
+ not needed any more.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
+ weren't sent out for the default grab group.
+
+ * gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
+ were getting events because they were part of the previous grab.
+
Tue Jan 15 12:23:33 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtknotebook.c (gtk_notebook_mnemonic_activate_switch_page):
typedef struct
{
- gboolean was_grabbed;
- GtkWidget *grab_widget;
+ GtkWidget *old_grab_widget;
+ GtkWidget *new_grab_widget;
} GrabNotifyInfo;
+static gboolean
+check_is_grabbed (GtkWidget *widget,
+ GtkWidget *grab_widget)
+{
+ if (grab_widget)
+ return !(widget == grab_widget || gtk_widget_is_ancestor (widget, grab_widget));
+ else
+ return TRUE;
+}
+
static void
gtk_grab_notify_foreach (GtkWidget *child,
gpointer data)
{
GrabNotifyInfo *info = data;
+ gboolean was_grabbed = check_is_grabbed (child, info->old_grab_widget);
+ gboolean is_grabbed = check_is_grabbed (child, info->new_grab_widget);
- if (child != info->grab_widget)
+ if (was_grabbed != is_grabbed)
{
g_object_ref (G_OBJECT (child));
-
- gtk_signal_emit_by_name (GTK_OBJECT (child), "grab_notify", info->was_grabbed);
-
+
+ gtk_signal_emit_by_name (GTK_OBJECT (child), "grab_notify", was_grabbed);
+
if (GTK_IS_CONTAINER (child))
- gtk_container_foreach (GTK_CONTAINER (child), gtk_grab_notify_foreach, info);
+ gtk_container_foreach (GTK_CONTAINER (child), gtk_grab_notify_foreach, info);
g_object_unref (G_OBJECT (child));
}
GList *toplevels;
GrabNotifyInfo info;
- info.grab_widget = grab_widget;
- info.was_grabbed = was_grabbed;
+ if (was_grabbed)
+ {
+ info.old_grab_widget = grab_widget;
+ info.new_grab_widget = group->grabs ? group->grabs->data : NULL;
+ }
+ else
+ {
+ info.old_grab_widget = (group->grabs && group->grabs->next) ? group->grabs->next->data : NULL;
+ info.new_grab_widget = grab_widget;
+ }
g_object_ref (group);
g_object_ref (grab_widget);
GtkWindow *toplevel = toplevels->data;
toplevels = g_list_delete_link (toplevels, toplevels);
- if (group == toplevel->group)
+ if (group == _gtk_window_get_group (toplevel))
gtk_container_foreach (GTK_CONTAINER (toplevel), gtk_grab_notify_foreach, &info);
g_object_unref (toplevel);
}
gtk_widget_ref (widget);
group->grabs = g_slist_prepend (group->grabs, widget);
- if (!was_grabbed)
- gtk_grab_notify (group, widget, FALSE);
+ gtk_grab_notify (group, widget, FALSE);
}
}
gtk_widget_unref (widget);
- if (!group->grabs)
- gtk_grab_notify (group, widget, TRUE);
+ gtk_grab_notify (group, widget, TRUE);
}
}
static void gtk_spin_button_editable_init (GtkEditableClass *iface);
static void gtk_spin_button_init (GtkSpinButton *spin_button);
static void gtk_spin_button_finalize (GObject *object);
+static void gtk_spin_button_destroy (GtkObject *object);
static void gtk_spin_button_set_property (GObject *object,
guint prop_id,
const GValue *value,
GdkEventCrossing *event);
static gint gtk_spin_button_focus_out (GtkWidget *widget,
GdkEventFocus *event);
+static void gtk_spin_button_grab_notify (GtkWidget *widget,
+ gboolean was_grabbed);
static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
guint arrow);
static gint gtk_spin_button_timer (GtkSpinButton *spin_button);
+static void gtk_spin_button_stop_spinning (GtkSpinButton *spin);
static void gtk_spin_button_value_changed (GtkAdjustment *adjustment,
GtkSpinButton *spin_button);
static gint gtk_spin_button_key_press (GtkWidget *widget,
gobject_class->set_property = gtk_spin_button_set_property;
gobject_class->get_property = gtk_spin_button_get_property;
+ object_class->destroy = gtk_spin_button_destroy;
+
widget_class->map = gtk_spin_button_map;
widget_class->unmap = gtk_spin_button_unmap;
widget_class->realize = gtk_spin_button_realize;
widget_class->enter_notify_event = gtk_spin_button_enter_notify;
widget_class->leave_notify_event = gtk_spin_button_leave_notify;
widget_class->focus_out_event = gtk_spin_button_focus_out;
+ widget_class->grab_notify = gtk_spin_button_grab_notify;
entry_class->activate = gtk_spin_button_activate;
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static void
+gtk_spin_button_destroy (GtkObject *object)
+{
+ gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (object));
+
+ GTK_OBJECT_CLASS (parent_class)->destroy (object);
+}
+
static void
gtk_spin_button_map (GtkWidget *widget)
{
return GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);
}
+static void
+gtk_spin_button_grab_notify (GtkWidget *widget,
+ gboolean was_grabbed)
+{
+ if (!was_grabbed)
+ gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (widget));
+}
+
static gint
gtk_spin_button_scroll (GtkWidget *widget,
GdkEventScroll *event)
return TRUE;
}
+static void
+gtk_spin_button_stop_spinning(GtkSpinButton *spin)
+{
+ if (spin->timer)
+ {
+ gtk_timeout_remove (spin->timer);
+ spin->timer = 0;
+ spin->timer_calls = 0;
+ spin->need_timer = FALSE;
+ }
+
+ spin->button = 0;
+ spin->timer = 0;
+}
+
+static void
+start_spinning (GtkSpinButton *spin,
+ GtkArrowType click_child,
+ gfloat step)
+{
+ spin->click_child = click_child;
+ gtk_spin_button_real_spin (spin, click_child == GTK_ARROW_UP ? step : -step);
+
+ if (!spin->timer)
+ {
+ spin->timer_step = step;
+ spin->need_timer = TRUE;
+ spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY,
+ (GtkFunction) gtk_spin_button_timer, (gpointer) spin);
+ }
+
+ gtk_spin_button_draw_arrow (spin, click_child);
+}
+
static gint
gtk_spin_button_button_press (GtkWidget *widget,
GdkEventButton *event)
{
if (!GTK_WIDGET_HAS_FOCUS (widget))
gtk_widget_grab_focus (widget);
- gtk_grab_add (widget);
spin->button = event->button;
if (GTK_ENTRY (widget)->editable)
if (event->y <= widget->requisition.height / 2)
{
- spin->click_child = GTK_ARROW_UP;
if (event->button == 1)
- {
- gtk_spin_button_real_spin (spin,
- spin->adjustment->step_increment);
- if (!spin->timer)
- {
- spin->timer_step = spin->adjustment->step_increment;
- spin->need_timer = TRUE;
- spin->timer = gtk_timeout_add
- (SPIN_BUTTON_INITIAL_TIMER_DELAY,
- (GtkFunction) gtk_spin_button_timer, (gpointer) spin);
- }
- }
+ start_spinning (spin, GTK_ARROW_UP, spin->adjustment->step_increment);
else if (event->button == 2)
- {
- gtk_spin_button_real_spin (spin,
- spin->adjustment->page_increment);
- if (!spin->timer)
- {
- spin->timer_step = spin->adjustment->page_increment;
- spin->need_timer = TRUE;
- spin->timer = gtk_timeout_add
- (SPIN_BUTTON_INITIAL_TIMER_DELAY,
- (GtkFunction) gtk_spin_button_timer, (gpointer) spin);
- }
- }
- gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);
+ start_spinning (spin, GTK_ARROW_UP, spin->adjustment->page_increment);
}
else
{
- spin->click_child = GTK_ARROW_DOWN;
if (event->button == 1)
- {
- gtk_spin_button_real_spin (spin,
- -spin->adjustment->step_increment);
- if (!spin->timer)
- {
- spin->timer_step = spin->adjustment->step_increment;
- spin->need_timer = TRUE;
- spin->timer = gtk_timeout_add
- (SPIN_BUTTON_INITIAL_TIMER_DELAY,
- (GtkFunction) gtk_spin_button_timer, (gpointer) spin);
- }
- }
+ start_spinning (spin, GTK_ARROW_DOWN, spin->adjustment->step_increment);
else if (event->button == 2)
- {
- gtk_spin_button_real_spin (spin,
- -spin->adjustment->page_increment);
- if (!spin->timer)
- {
- spin->timer_step = spin->adjustment->page_increment;
- spin->need_timer = TRUE;
- spin->timer = gtk_timeout_add
- (SPIN_BUTTON_INITIAL_TIMER_DELAY,
- (GtkFunction) gtk_spin_button_timer, (gpointer) spin);
- }
- }
- gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);
+ start_spinning (spin, GTK_ARROW_DOWN, spin->adjustment->page_increment);
}
return TRUE;
}
{
guint click_child;
- if (spin->timer)
- {
- gtk_timeout_remove (spin->timer);
- spin->timer = 0;
- spin->timer_calls = 0;
- spin->need_timer = FALSE;
- }
+ gtk_spin_button_stop_spinning (spin);
if (event->button == 3)
{
}
}
}
- gtk_grab_remove (widget);
click_child = spin->click_child;
spin->click_child = 2;
- spin->button = 0;
gtk_spin_button_draw_arrow (spin, click_child);
return TRUE;
}